/*
@Time : 2019/8/26 0026 16:47
@Author : visons
*/
package main

import (
	"fmt"
	"github.com/go-redis/redis"
)

/**
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的，这就意味着集合中不能出现重复的数据。
Redis 中集合是通过哈希表实现的，所以添加，删除，查找的复杂度都是 O(1)。
*/
func SetTest(client *redis.Client) {
	/**
	sadd(key, member)：
	将一个或多个 member 元素加入到集合 key 当中，已经存在于集合的 member 元素将被忽略。
	假如 key 不存在，则创建一个只包含 member 元素作成员的集合。
	当 key 不是集合类型时，返回一个错误。
	*/
	effect, err := client.SAdd("k1", "a", "b", "c", "d").Result()
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(effect) //返回插入成功的数目

	/**
	srem(key, member) ：
	移除集合 key 中的一个或多个 member 元素，不存在的 member 元素会被忽略。
	当 key 不是集合类型，返回一个错误。
	*/
	effect, err = client.SRem("k1", "c", "d").Result()
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(effect)

	//spop(key) ：随机返回并删除名称为key的set中一个元素。
	ret, err := client.SPop("k1").Result()
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(ret)

	/**
	smove(srckey, dstkey, member) ：
	将 member 元素从 source 集合移动到 destination 集合。
	SMOVE 是原子性操作。
	如果 source 集合不存在或不包含指定的 member 元素，则 SMOVE 命令不执行任何操作，仅返回 0 。否则， member 元素从 source 集合中被移除，并添加到 destination 集合中去。
	当 destination 集合已经包含 member 元素时， SMOVE 命令只是简单地将 source 集合中的 member 元素删除。
	当 source 或 destination 不是集合类型时，返回一个错误。
	*/
	ok, err := client.SMove("k1", "k2", "a").Result()
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(ok)

	//scard(key) ：返回集合 key 的基数(集合中元素的数量)。
	length, err := client.SCard("k1").Result()
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(length)

	//smembers(key) ：返回名称为key的set的所有元素。
	rets, err := client.SMembers("k1").Result()
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(rets)

	//srandmember(key) ：随机返回名称为key的set的一个元素。
	ret, err = client.SRandMember("k1").Result()
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(ret)

	//sismember(key, member) ：member是否是名称为key的set的元素。
	ok, err = client.SIsMember("k1", "c").Result()
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(ok)

	//sinter(key1, key2,…key N) ：求交集。
	//sunion(key1, (keys)) ：求并集。
	//sdiff(key1, (keys)) ：求差集。
}
